package com.zx._01_基础._012_反射;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class VoidDemo {

    public static void main(String[] args) throws Exception {
        // 2. 在泛型出现之前，Void一般用于反射之中。例如，下面的代码打印返回类型为void的方法名
        for (Method method : VoidDemo.class.getMethods()) {
            Class<?> returnType = method.getReturnType();
            System.out.println("method=" + method.getName() + ", returnType="
                    + returnType.getName() + ", " + returnType.equals(Void.TYPE)
                    + ", " + returnType.equals(Void.class));
        }

        // 3.泛型出现后，某些场景下会用到Void类型。例如Future<T>用来保存结果。Future的get方法会返回结果(类型为T)。
        // 但如果操作并没有返回值呢？这种情况下就可以用Future<Void>表示。当调用get后结果计算完毕则返回后将会返回null。
        ExecutorService pool = Executors.newFixedThreadPool(10);
        Future<Void> future = pool.submit(() -> {
            TimeUnit.SECONDS.sleep(2);
            return null;
        });
        Void vid = future.get();
        System.out.println(vid);
        pool.shutdown();
        pool.shutdownNow();

        // 4.Void也用于无值的Map中，例如Map<T,Void>这样map将具Set<T>有一样的功能
        // 因此当你使用泛型时函数并不需要返回结果或某个对象不需要值时候这是可以使用java.lang.Void类型表示。
        Map<String, Void> map = new HashMap<>();
        Void nil = null;
        map.put("1", nil);

    }

    // 1. Void 作为返回类型，返回值必须是null
    // 通过Void类的代码可以看到，Void类型不可以继承与实例化。
    public Void get() {
        Void nil = null;
        return nil;
    }

    public void getByName() {
        System.out.println("123");
    }
}
